package extend.db.shard;

import extend.db.base.Dao;
import extend.db.base.Query;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 分表
 * <B>说明：</B>
 * <pre>
 *  略
 * </pre>
 * <B>示例：</B>
 * <pre>
 *  略
 * </pre>
 * <B>日志：</B>
 * <pre>
 *  略
 * </pre>
 * <B>注意事项：</B>
 * <pre>
 *  略
 * </pre>
 */
public class ShardTableDao extends Dao
{

    /**
     * 添加数据行总接口
     *<B>说明：</B>
     *<pre>
     *  可以重写，以便实现分表，分库，等功能
     *</pre>
     * @param query 查询命令
     * @return Query
     */
    public Query addInternal(Query query)
    {
        int affected = 0;
        List<Query> querys = ShardUtil.parseQueryDataForTable(query,this.getClass());
        for (Query cmdQuery:querys) {
            int result = this.executeCommand(cmdQuery);
            query.setResult(affected);
            affected += result;
        }

        query.setResult(affected);

        return query;
    }

    /**
     * 修改记录总接口
     *<B>说明：</B>
     *<pre>
     *  可以重写，以便实现分表，分库，等功能
     *</pre>
     * @param query 查询命令
     * @return Query
     */
    public Query updateInternal(Query query)
    {
        int affected = 0;

        List<Query> querys = ShardUtil.parseQueryWhereForTable(query,this.getClass());
        for (Query cmdQuery:querys) {
            int result = this.executeCommand(cmdQuery);
            query.setResult(affected);
            affected += result;
        }

        query.setResult(affected);

        return query;
    }

    /**
     * 修改记录总接口
     *<B>说明：</B>
     *<pre>
     *  可以重写，以便实现分表，分库，等功能
     *</pre>
     * @param query 查询命令
     * @return Query
     */
    public Query deleteInternal(Query query)
    {

        int affected = 0;

        List<Query> querys = ShardUtil.parseQueryWhereForTable(query,this.getClass());
        for (Query cmdQuery:querys) {
            int result = this.executeCommand(cmdQuery);
            query.setResult(affected);
            affected += result;
        }

        query.setResult(affected);

        return query;
    }

    /**
     * 修改记录总接口
     *<B>说明：</B>
     *<pre>
     *  可以重写，以便实现分表，分库，等功能
     *</pre>
     * @param query 查询命令
     * @return Query
     */
    public Query queryInternal(Query query)
    {
        // @todo 优化成联合查询
        List<Query> querys = ShardUtil.parseQueryWhereForTable(query,this.getClass());
        List<Map<String,Object>> rows = new ArrayList<>();
        for (Query cmdQuery:querys) {
            rows.addAll(this.queryCommand(cmdQuery));
        }

        query.setResult(rows);

        return query;
    }
}
